#include <stdio.h>

/* now x is global variable */
int x;

int main()
{
	printf("Enter x:\n");
	scanf("%d", &x);

	printf("you entered %d ...\n", x);
	return 0;
}

#if 0
/*
 * x86
 */
	x变量的存储空间是数据段(data段)，反而没有使用数据栈。因此整个程序的所有指令都可以直接访问全局变量 x。

	未初始化的全局变量，系统会自动初始化为零。


/*
 * arm
 */
	因为变量x是全局变量，所以它出现于数据段的".data"字段里。

	为什么文字符串出现在代码段(.text)，但是x变量却出现于数据段(.data)?

	原因在于x是变量。变量的值可变，属于一种频繁变化的可变数据。

	在arm系统里，代码段的程序代码可存储于处理器的ROM(read-only memory)，而可变变量存储于RAM(random-access meoory)中。arm系统的
	内存寻址能力有限，可用内存往往十分紧张。在arm系统存在ROM的情况下，使用RAM内存存储常量则明显是一种浪费。此外，arm系统在启动
	之后RAM里的值都是随机数；想要使用RAM存储常量，还要单独进行初始化赋值才行。

	程序给变量x分配了一个指针。此后，程序都是通过这个指针对x变量进行的操作。不这样做的话变量x可能被分配到距离程序代码段很远的
	空间，其偏移量有可能超过有关寻址指令的寻址能力。Thumb下，LDR只能够使用周边 1020 字节之内的变量；32bit ARM， 也只能调用偏移量
	在+/4095 字节之内的变量。这个范围就是变量地址(与调用指令之间)的偏移量的局限。为了保证它的地址离代码段足够近，能被代码调用，
	就需要就近分配x变量的地址。由于在链接阶段(linker) x 的地址可能会被随意分配，甚至可能被分配到外部内存的地址，所以编译器必须
	在前期阶段就把 x 的地址分配到就近的区域之内。
	
/*
 * arm64
 */
	通过adrp/add指令对计算它的指针。

#endif

#if 0
/*
 * intel
 */
0000000000001189 <main>:
    1189:	f3 0f 1e fa          	endbr64 
    118d:	55                   	push   %rbp
    118e:	48 89 e5             	mov    %rsp,%rbp
    1191:	48 8d 3d 6c 0e 00 00 	lea    0xe6c(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>	// rdi="Enter x:\n"
    1198:	e8 d3 fe ff ff       	callq  1070 <puts@plt>		// puts(rdi)

    119d:	48 8d 35 70 2e 00 00 	lea    0x2e70(%rip),%rsi        # 4014 <x>	// rsi=4014=x
    11a4:	48 8d 3d 62 0e 00 00 	lea    0xe62(%rip),%rdi        # 200d <_IO_stdin_used+0xd>
    11ab:	b8 00 00 00 00       	mov    $0x0,%eax
    11b0:	e8 db fe ff ff       	callq  1090 <__isoc99_scanf@plt>

    11b5:	8b 05 59 2e 00 00    	mov    0x2e59(%rip),%eax        # 4014 <x>
    11bb:	89 c6                	mov    %eax,%esi
    11bd:	48 8d 3d 4c 0e 00 00 	lea    0xe4c(%rip),%rdi        # 2010 <_IO_stdin_used+0x10>
    11c4:	b8 00 00 00 00       	mov    $0x0,%eax
    11c9:	e8 b2 fe ff ff       	callq  1080 <printf@plt>

    11ce:	b8 00 00 00 00       	mov    $0x0,%eax
    11d3:	5d                   	pop    %rbp
    11d4:	c3                   	retq   
    11d5:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
    11dc:	00 00 00 
    11df:	90                   	nop

/*
 * arm
 */
00000000004005fc <main>:
  4005fc:	a9bf7bfd 	stp	x29, x30, [sp, #-16]!
  400600:	910003fd 	mov	x29, sp
  400604:	90000000 	adrp	x0, 400000 <_init-0x468>
  400608:	911be000 	add	x0, x0, #0x6f8
  40060c:	97ffffb1 	bl	4004d0 <puts@plt>

  400610:	b0000080 	adrp	x0, 411000 <__libc_start_main@GLIBC_2.17>
  400614:	91011001 	add	x1, x0, #0x44
  400618:	90000000 	adrp	x0, 400000 <_init-0x468>
  40061c:	911c2000 	add	x0, x0, #0x708
  400620:	97ffffb0 	bl	4004e0 <__isoc99_scanf@plt>	// scanf(x0, x1)

  400624:	b0000080 	adrp	x0, 411000 <__libc_start_main@GLIBC_2.17>
  400628:	91011000 	add	x0, x0, #0x44
  40062c:	b9400001 	ldr	w1, [x0]
  400630:	90000000 	adrp	x0, 400000 <_init-0x468>
  400634:	911c4000 	add	x0, x0, #0x710
  400638:	97ffffae 	bl	4004f0 <printf@plt>		// printf(x0, w1)

  40063c:	52800000 	mov	w0, #0x0                   	// #0
  400640:	a8c17bfd 	ldp	x29, x30, [sp], #16
  400644:	d65f03c0 	ret


#endif

